#ifndef _RECORD_SERVER_H_
#define _RECORD_SERVER_H_

#include "file_index.h"
#include "rec_write.h"
#include <vector>

using namespace std;

class CRecordServer
{
public:
	CRecordServer();
	~CRecordServer();

	int Open(int ch,int stream_type,char * storage_path);

	int Close();
	
	//开始录像，is_auto_get 
	/*
	is_auto_get 是否自动获取
	*/
	int Start(bool auto_getfrm);

	int WriteData(char * buf, int size);

	int Stop();

	bool GetCycleStatus()
	{
		return m_bRecycleRecord;
	}

	static int PUB_THREAD_CALL DataProcThread(void *pParam);
protected:
	int StartRecord(int type, int64_t time, char *pText = NULL, uint32_t textLen = 0);
	
	int StopRecord(int type, bool bCloseFile = false, int newType = RECORD_NONE);

	int RecordByRepairFile(int type, int64_t time, char *pText = NULL, uint32_t textLen = 0);

	void Continue();	//继续录像

	void Pause();		//暂停录像
protected:
	char            m_storage[64];
	int             m_channel;
	int             m_stream_type;

	int				m_vFrameCnt;			//帧写入计数
	bool			m_bRecycleRecord;		//是否覆盖录像

	CRecWriteBase * m_pWriter;
	
	CFileIndex    * m_pIndex;               //录像段索引

	bool			m_bEnablePre;			//是否开启预录像
	
	bool			m_bPrepareData;			//是否已经缓冲好预录像
	bool			m_bSleep;				//是否处于休眠状态
	bool			m_bStart;				//是否已经写了开始
	uint16_t		m_bOpenFile;			//是否打开文件
	uint16_t		m_diskGroup;			//磁盘分组序号
	uint16_t		m_curDiskIdx;			//磁盘序号
	uint16_t		m_bLockRecord;			//是否锁定录像，锁定状态时，只能手动开启或停止
	int				m_rate;					//码率

	//CIndexSet		*m_pRecIndexSet;		//索引管理

	bool			m_bManualRec;			//当前正处于何种录像类型
	uint32_t		m_fileIndex;			//当前文件索引
	uint32_t		m_fileLength;			//记录一次开始到结束写入的数据总长度。

	int64_t			m_startTime;			//录像开始时间
	int64_t			m_stopChkTime;			//最后停止检查时间
	int64_t         m_lastFrmTIme;			//最后一帧时间
	time_t          m_checkTm;
	int		        m_dataSourceID;		    //视频流信息
	uint32_t        m_recordSN;             //录像文件序列号
	REC_FILE_INFO	m_recSegInfo;			//文件信息
	bool            m_auto_get_frm;        //自动获取流
};


#endif